package br.edu.unifei.cct810.projetofinal.analise.modelo;

public class AnaliseSintatica {
	
	/** gramatica utilizada na analise sintatica*/
	private AnaliseSemantica semantica = null;
	private Token tk = null;
	private String erros = "";
	private String resultado = "";
	private static String Clrf = "\n";
	public static String GRAMATICA =  
								"prog -> dec incio list_cmd fim ."+ Clrf +
								"dec -> variaveis list_decl"+Clrf +
								"list_decl -> lista  :  tipo_var  ;  list_decl  | ?"+Clrf +
								"lista -> 'identificador' list_var"+Clrf +
								"list_var -> ,  'identificador'  list_var  |  ?"+Clrf +
								"tipo_var -> tipo |  vetor [ 'numero inteiro' ..   'numero inteiro' ] de tipo"+Clrf +
								"tipo -> INTEIRO  |  REAL  |  LOGICO  |  CADEIA  |  CARACTER | LISTA_REAL | LISTA_INT | CADEIA | TEXTO"+Clrf +
								"list_cmd -> cmd  ;  list_cmd  | ?"+Clrf +
								"cmd -> LEIA lista2  |  ESCREVA lista3 |  ENQUANTO expr cmd  |"+Clrf +
								"SE expr ENTAO cmd cmd2  |"+Clrf +          
								"lista2 -> 'identificador' list_var2"+Clrf +
								"list_var2 -> ,  lista2  |  [  indice ] list_var2  |  ?"+Clrf +
								"lista3 -> 'identificador' list_var3  |  'literal' list_var3  |  ?"+Clrf +
								"list_var3 -> ,  lista3  |  [  indice ] list_var3  |  ?"+Clrf +
								"indice -> 'numero inteiro'  |  'identificador' id2"+Clrf +
								"exp -> verdadeiro  |  falso  |  'literal'  |  termo exp2"+Clrf +
								"termo -> fator termo2"+Clrf +
								"termo2 -> op_mult fator termo2  |  ?"+Clrf +
								"fator -> (  exp  )  |  id"+Clrf +
								"id -> 'numero'  |  'identificador'  id2"+Clrf +
								"id2 ->  [ indice ]  |  ?"+Clrf +
								"exp2 -> op_aditivo termo exp2  |  ?"+Clrf +
								"op_aditivo -> + |  -"+Clrf +
								"op_mult -> *  |  /  |  %  "+Clrf +
								"expr -> exp op_relacional exp expr2"+Clrf +
								"expr2 -> op_logico expr  |  ?"+Clrf +
								"op_logico -> .E. | .OU. | .NAO. "+Clrf +
								"op_relacional ->  .IGU.  |  .DIF.  |  .MEI.  |  .MAI.  |  .MAQ.  |  .MEQ. ";
	
	public AnaliseSintatica(Token tk) {
		this.tk = tk;
		this.analiseSemantica();
	}
	
	public void analiseSemantica() {
		this.semantica = new AnaliseSemantica(tk);
		this.erros = semantica.getErroSintatico();
	}

	public AnaliseSemantica getSemantica() {
		return semantica;
	}

	public Token getToken() {
		return tk;
	}

	public String getErros() {
		return erros;
	}

	public String getResultado() {
		return resultado;
	}	
}
